package cn.whdream.datastructure.tree;

import java.util.Arrays;

/**
 * 
 * @author admin
 *  堆排序
 */
public class HeapSortDemo {
	public static void main(String[] args) {
		int arr[] = {4,6,8,5,9};
		heapSort(arr);
	}
	
	public static void heapSort(int arr[]) {
		//TODO 堆排序之后再深挖一下 
		for (int i = arr.length/2 -1 ; i >= 0; i--) {
			adjustHeap(arr, i, arr.length);
		}
		System.out.println(Arrays.toString(arr));
	}
	/**
	 * 
	 * @param arr 待调整的数组
	 * @param i 非叶子结点的子树(从左到右，从下到上)
	 * @param length
	 */
	public static void adjustHeap(int arr[] ,int i ,int length) {
		
		int temp = arr[i];//保存临时变量
		for (int k = i * 2 + 1; k < arr.length; k = k * 2 + 1) {
			//说明左子节点小于右子节点
			if (k + 1 < length && arr[k] < arr[k+1]) {
				k++;
			}
			
			if(arr[k] > temp) {
				//将大于父节点的子节点赋值上去
				arr[i] = arr[k];
				//用于再上面一层开始遍历，两个左右子树
				i = k;
			}else {
				break;
			}
		}
		//当for循环解释， i为父节点的子树的最大值放到顶部
		arr[i] = temp;
	}
}
